#include "vec4f.h"

//
// toZero
//
void vec4f::toZero() {
	this->x = 0.0f;
	this->y = 0.0f;
	this->z = 0.0f;
	this->w = 0.0f;
};

//
//	Inverse
//
vec4f vec4f::inverse() const {
	return vec4f(-x, -y, -z, -w);
}

//
//	LengthSquared - useful if we want to avoid expensive sqrt()
//
float vec4f::lengthSquared() const {
	return (x * x) + (y * y) + (z * z) + (w * w);
};

//
//	Length - Vector magnitude
//
float vec4f::length() const {
	if(lengthSquared() == 0) { return 0; }
	return sqrt(lengthSquared());
};





//
//	Dot product
//
static vec4f dot(const vec4f &a, const vec4f &b) {
	return vec4f((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w));
};




//
//	Inverse operator
//
inline vec4f vec4f::operator-() const {
	return vec4f(-x, -y, -z, -w);
};

//
//	Comparison operator
//
inline bool vec4f::operator==(const vec4f &src) const {
	return ((x == src.x) && (y == src.y) && (z == src.z) && (w == src.w)) ? true : false;
};
inline bool vec4f::operator!=(const vec4f &src) const {
	return ((x == src.x) && (y == src.y) && (z == src.z) && (w == src.w)) ? false : true;
};

//
//	Vector Addition
//
inline vec4f vec4f::operator+(const vec4f &src) const {
	return vec4f( (this->x + src.x), (this->y + src.y), (this->z + src.z), (this->w + src.w) );
};

//
//	Vector Subtraction
//
inline vec4f vec4f::operator-(const vec4f &src) const {
	return vec4f( (this->x - src.x), (this->y - src.y), (this->z - src.z), (this->w - src.w) );
};

//
//	Vector multiplication
//
inline vec4f vec4f::operator*(const vec4f &src) const {
	return vec4f((x * src.x), (y * src.y), (z * src.z), (w * src.w));
};

//
//	Vector division
//
inline vec4f vec4f::operator/(const vec4f &src) const {
	return vec4f((x / src.x), (y / src.y), (z / src.z), (w / src.w));
};

//
//	Vector add-equals +=
//
inline void vec4f::operator+=(const vec4f &src) {
	this->x += src.x;
	this->y += src.y;
	this->z += src.z;
	this->w += src.w;
};

//
//	Vector subtract-equals -=
//
inline void vec4f::operator-=(const vec4f &src) {
	this->x -= src.x;
	this->y -= src.y;
	this->z -= src.z;
	this->w -= src.w;
};

//
//	Vector multiply-equals *=
//
inline void vec4f::operator*=(const vec4f &src) {
	this->x *= src.x;
	this->y *= src.y;
	this->z *= src.z;
	this->w *= src.w;
};

//
//	Vector divide-equals
//
inline void vec4f::operator/=(const vec4f &src) {
	this->x /= src.x;
	this->y /= src.y;
	this->z /= src.z;
	this->z /= src.w;
};





//
//	Scalar addition
//
inline vec4f vec4f::operator+(const float a) const {
	return vec4f((x + a), (y + a), (z + a), (w + a));
};

//
//	Scalar subtraction
//
inline vec4f vec4f::operator-(const float a) const {
	return vec4f((x - a), (y - a), (z - a), (w - a));
};

//
//	Scalar multiplication
//
inline vec4f vec4f::operator*(const float a) const {
	return vec4f((x * a), (y * a), (z * a), (w * a));
};

//
//	Scalar division
//
inline vec4f vec4f::operator/(const float a) const {
	return vec4f((x / a), (y / a), (z / a), (w / a));
};